package com.aaa.jvmtest.methodarea;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * StringTable调优2
 * 如果有大量的字符串，且字符串可能重复的情况下
 * 可以考虑是否存入串池，使用intern进行一次检查(串池中是否有此对象)
 *
 * @author Tu
 * @date 2022/6/10 16:32
 */
public class StringTables_optimize2 {

    /**
     * 没使用intern之前：70多万
     * 使用intern之后： 60多万
     */
    public static void main(String[] args) throws IOException {
        //使用对象，防止触发垃圾回收
        List<String> list = new ArrayList<>();
        //获取流下一个字符，没有返回-1。   会一直阻塞,直到做出操作
        System.in.read();
        for (int i = 0; i < 10; i++) {
            //缓冲流 + 输入流
            //try 可自动close
            try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\QQ接收、学习\\个人事务\\入党\\党员发展\\思想汇报范文---总.docx"), "utf-8"))) {
                String line = null;
                //记录当前时间(纳秒)
                Long start = System.nanoTime();
                while (true) {
                    //读取一行文本
                    line = bufferedReader.readLine();
                    if (line == null) {
                        break;
                    }
                    list.add(line.intern());
                }
                //打印花费时间 (/10的六次方得出毫秒)
                System.out.println("cost:" + (System.nanoTime() - start) / 1000000);
            }
        }
        System.in.read();
    }

}
